package avicit.cbb.techclass.tabledefine.commtempletmanager.action.service.impl;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import avicit.cbb.techclass.tabledefine.commtempletmanager.action.service.CommTempletManagerService;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import avicit.platform6.core.jdbc.Page;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import avicit.cbb.techclass.appreg.domain.CbbSysInfo;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletCode;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletField;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletInfo;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletSysCode;
import avicit.platform6.commons.utils.ComUtil;
import avicit.platform6.commons.utils.PojoUtil;
import avicit.platform6.commons.utils.web.TreeNode;
import avicit.platform6.core.dao.Paging;
import avicit.platform6.core.dao.PropertyFilter;
import avicit.platform6.core.domain.BeanBase;
import avicit.platform6.core.exception.DaoException;
import avicit.platform6.core.jdbc.JdbcAvicit;
import avicit.platform6.core.jdbc.Page;
import avicit.platform6.core.properties.PlatformConstant.OpResult;
import avicit.platform6.core.properties.PlatformConstant.OpType;
import avicit.platform6.core.service.ServiceBase;
import avicit.platform6.modules.system.syslog.service.LogBaseFactory;
import avicit.platform6.modules.system.syslog.service.SysLogUtil;

/**
 * Title: MdmDbTable服务实现类 Description:
 * MdmDbTable服务实现类，实现了接口CommTempletManagerService所定义的针对对象的各种操作 Copyriht:
 * Copyright (c) 2012 Company: AVICIT Co., Ltd
 *
 * @author 朱锋
 * @version 1.0 Date: 2014-08-19
 */
@SuppressWarnings("unchecked")
@Service
public class CommTempletManagerServiceImpl extends ServiceBase implements CommTempletManagerService {

	@Autowired(required = false)
	private JdbcAvicit jdbcAvicit;
	@Autowired(required = true)
	private JdbcTemplate jdbcTemplate;
	// 导出所用的对象声明
	private HSSFWorkbook workbook;
	private HSSFSheet sheet;
	private HSSFRow row = null;
	private HSSFCell cell = null;
	private HSSFCellStyle stringstyle;
	private HSSFCellStyle headStyle;
	// 解析2003文件后的数据
	private Map<String, Vector<Vector<String>>> sheetXls = new HashMap<String, Vector<Vector<String>>>();
	// 解析2007文件后的数据
	private Map<String, Vector<Vector<String>>> sheetXlsx = new HashMap<String, Vector<Vector<String>>>();

	@Override
	public void delete(BeanBase arg0) throws DaoException {
		// TODO Auto-generated method stub

	}

	@Override
	public void insert(BeanBase arg0) throws DaoException {
		// TODO Auto-generated method stub

	}

	@Override
	public void update(BeanBase arg0) throws DaoException {
		// TODO Auto-generated method stub

	}

	/**
	 * 获取参考模板基本信息--（表格用的带分页）
	 */
	@Override
	public Paging<CbbTempletInfo> getPageList(Paging<CbbTempletInfo> page, Map<String, Object> parameter, String sysId) throws Exception{
		List<PropertyFilter> filters = PropertyFilter.buildFromParameterMap(parameter);
		String hql = "from CbbTempletInfo ";
		HashMap<String, Object> valueMap = new HashMap<String, Object>();
		if (null != parameter) {
			hql = hibernateDao.buildDynamicHql(filters, hql, valueMap);
		}
		Paging<CbbTempletInfo> paging = hibernateDao.findPage(page, hql, valueMap);
		return paging;
	}

	/**
	 * 根据参考模板基本信息ID获取该对象
	 */
	@Override
	public CbbTempletInfo getCommTempletInfoById(String id) throws Exception {
		CbbTempletInfo h = (CbbTempletInfo) hibernateDao.getSession().get(CbbTempletInfo.class, id);
		return h;
	}

	/**
	 * 参考模板基本信息名称唯一性验证
	 */
	@Override
	public boolean checkUnique(String name, String id, String sysId) throws Exception{
		String sql = "";
		if (id == null || "".equals(id)) {
			// 新增
			sql = "select count(*) from CBB_TEMPLET_INFO t where t.TEMP_NAME='" + name + "'";
		} else {
			// 编辑
			sql = "select count(*) from CBB_TEMPLET_INFO t where t.TEMP_NAME='" + name + "' and t.id <> '" + id + "'";
		}
		boolean bool = false;
		List<Object> objList = hibernateDao.findBySQL(sql);
		if (objList != null && objList.size() > 0) {
			int count = Integer.valueOf(String.valueOf(objList.get(0)));
			bool = count == 0 ? false : true;
		}
		return bool;
	}

	/**
	 * 更新参考模板基本信息
	 */
	@Override
	public void updateCommTempletInfo(CbbTempletInfo bean) throws Exception {
		if (bean == null) {
			throw new Exception("对象转换为CbbTempletInfo对象出错！");
		}
		CbbTempletInfo oldBean = getCommTempletInfoById(bean.getId());
		hibernateDao.evict(oldBean);
		CbbTempletInfo newBean = new CbbTempletInfo();
		PojoUtil.copyProperties(newBean, oldBean, true);
		PojoUtil.copyProperties(newBean, bean, true);
		SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
		PojoUtil.setSysProperties(newBean, OpType.update);
		hibernateDao.update(newBean);
	}

	/**
	 * 新增参考模板基本信息
	 */
	@Override
	public void insertCommTempletInfo(CbbTempletInfo commTempletInfo, String orgId, String deptId) throws Exception {
		if (commTempletInfo == null) {
			throw new Exception("对象转换为cbbTempletInfo对象出错！");
		}
		String id = ComUtil.getId();
		commTempletInfo.setId(id);
		PojoUtil.setSysProperties(commTempletInfo, OpType.insert);
		commTempletInfo.setDeptId(deptId);
		commTempletInfo.setOrgId(orgId);
		hibernateDao.save(commTempletInfo);
		SysLogUtil.log(commTempletInfo, null, OpType.insert, OpResult.success);
	}

	/**
	 * 新增系统通用代码信息
	 */
	@Override
	public void insertSysCode(String cid, String tid, String fid, String sysId, String orgId, String deptId) throws Exception {
		// 删除存在的系统通用代码数据
		String sql = "delete from CBB_TEMPLET_SYS_CODE t\n" + " where t.templet_id = '" + tid + "'\n" + "   and t.field_id = '" + fid + "'";
		jdbcTemplate.update(sql);
		SysLogUtil.log("参考模板模块", "删除系统通用代码配置记录", OpType.delete, OpResult.success, LogBaseFactory.getLogBase());
		// 新增系统通用代码数据
		CbbTempletSysCode commTempletSysCode = new CbbTempletSysCode();
		String id = ComUtil.getId();
		commTempletSysCode.setId(id);
		commTempletSysCode.setSysLookupId(cid);
		commTempletSysCode.setTempletId(tid);
		commTempletSysCode.setFieldId(fid);
		commTempletSysCode.setOrgId(orgId);
		commTempletSysCode.setDeptId(deptId);
		commTempletSysCode.setSysId("1");
		PojoUtil.setSysProperties(commTempletSysCode, OpType.insert);
		hibernateDao.save(commTempletSysCode);
		SysLogUtil.log(commTempletSysCode, null, OpType.insert, OpResult.success);
	}

	/**
	 * 删除参考模板基本信息
	 *
	 * @throws Exception
	 */
	public void deleteCommTempletInfoBatch(String ids, String sysId) throws Exception {
		Assert.notNull(ids);
		String[] idArray = ids.split(",");
		for (int i = 0; i < idArray.length; i++) {
			deleteCommTempletInfoById(idArray[i], sysId);
		}
	}

	@Override
	public void deleteCommTempletInfoById(String id, String sysId) throws Exception {
		CbbTempletInfo commTempletInfo = getCommTempletInfoById(id);
		if (commTempletInfo == null) {
			throw new Exception("CbbTempletInfo对象不存在！");
		}
		try {
			String sql = "select t.id from CBB_TEMPLET_FIELD t where t.TEMPLET_ID='" + id + "'";
			List<Object> objList = hibernateDao.findBySQL(sql);
			for (int i = 0; i < objList.size(); i++) {
				String templetId = String.valueOf(objList.get(i));
				deletecommTempletFieldById(templetId, sysId);
			}
			hibernateDao.delete(commTempletInfo);
			SysLogUtil.log(commTempletInfo, null, OpType.delete, OpResult.success);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 根据参考模板字段信息ID删除该数据
	 */
	@Override
	public void deletecommTempletFieldById(String id, String sysId) throws Exception {
		CbbTempletField commTempletField = getCommTempletFieldById(id);
		if (commTempletField == null) {
			throw new Exception("CbbTempletField对象不存在！");
		}
		hibernateDao.delete(commTempletField);
		SysLogUtil.log(commTempletField, null, OpType.delete, OpResult.success);
	}

	/**
	 * 根据参考模板代码维护删除该数据
	 *
	 * @author 朱锋
	 * @param id
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void deletecommTempletCodeById(String id, String sysId) throws Exception {
		CbbTempletCode commTempletCode = getCommTempletCodeById(id);
		if (commTempletCode == null) {
			throw new Exception("cbbTempletCode对象不存在！");
		}
		hibernateDao.delete(commTempletCode);
		SysLogUtil.log(commTempletCode, null, OpType.delete, OpResult.success);
	}

	/**
	 * 根据参考模板字段信息ID查询根据参考模板字段数据
	 */
	@Override
	public CbbTempletField getCommTempletFieldById(String id) throws Exception{
		CbbTempletField h = (CbbTempletField) hibernateDao.getSession().get(CbbTempletField.class, id);
		return h;
	}

	/**
	 * 根据参考模板代码维护ID查询参考模板代码维护数据
	 */
	@Override
	public CbbTempletCode getCommTempletCodeById(String id) {
		CbbTempletCode h = (CbbTempletCode) hibernateDao.getSession().get(CbbTempletCode.class, id);
		return h;
	}

	/**
	 * 获取参考模板字段数据信息
	 */
	@Override
	public Paging<CbbTempletField> getPageDetailList(Paging<CbbTempletField> page, Map<String, Object> parameter, String sysId) {
		List<PropertyFilter> filters = PropertyFilter.buildFromParameterMap(parameter);
		String hql = "from CbbTempletField";
		HashMap<String, Object> valueMap = new HashMap<String, Object>();
		if (null != parameter) {
			hql = hibernateDao.buildDynamicHql(filters, hql, valueMap);
		}
		hql = hql + " order by colOrder";
		Paging<CbbTempletField> paging = hibernateDao.findPage(page, hql, valueMap);
		return paging;
	}

	/**
	 * 获取通用代码信息
	 * @return
	 */
	@Override
	public Page<Map<String, Object>> getPageCodeDetailList(Paging<CbbTempletCode> page, Map<String, Object> parameter, String sysId) throws Exception{
		String tid = (String) parameter.get("tid");
		String fid = (String) parameter.get("fid");
		StringBuffer sbSql = new StringBuffer();
		sbSql.append("SELECT T.ID,\n");
		sbSql.append("       T.TEMPLET_ID,\n");
		sbSql.append("       T.FIELD_ID,\n");
		sbSql.append("       T.CODE_ORDER,\n");
		sbSql.append("       T.LOOKUP_NAME,\n");
		sbSql.append("       T.LOOKUP_CODE,\n");
		sbSql.append("       T.CODE_IS_VALID,\n");
		sbSql.append("       T.CTYPE,\n");
		sbSql.append("       T.CREATED_BY,\n");
		sbSql.append("       T.CREATION_DATE,\n");
		sbSql.append("       T.LAST_UPDATED_BY,\n");
		sbSql.append("       T.LAST_UPDATE_DATE,\n");
		sbSql.append("       T.LAST_UPDATE_IP\n");
		sbSql.append("  FROM CBB_TEMPLET_LOOKUP_V T\n");
		sbSql.append(" WHERE T.TEMPLET_ID = '" + tid + "'\n");
		sbSql.append("   AND T.FIELD_ID = '" + fid + "'");
		Page<Map<String, Object>> pageBean = new Page<Map<String, Object>>(page.getPageNo(), page.getPageSize());
		jdbcAvicit.getDatesByPageForMap(pageBean, sbSql.toString(), parameter, null);
		return pageBean;
	}

	/**
	 * 获取平台通用代码信息
	 */
	@Override
	public Page<Map<String, Object>> getPageSysCodeDetailList(Paging<CbbTempletCode> page, Map<String, Object> parameter, String sysId) throws Exception{
		String codeType = String.valueOf(parameter.get("codeType"));
		String codeName = String.valueOf(parameter.get("codeName"));
		StringBuffer sbSql = new StringBuffer();
		sbSql.append("SELECT *\n");
		sbSql.append("  FROM CBB_TEMPLET_LOOKUP_TYPE_V T WHERE 1=1 \n");
		if (!"".equals(codeType) && !"null".equals(codeType)) {
			sbSql.append("   AND T.LOOKUP_TYPE LIKE '%" + codeType + "%'\n");
		}
		if (!"".equals(codeName) && !"null".equals(codeName)) {
			sbSql.append("   AND T.LOOKUP_TYPE_NAME LIKE '%" + codeName + "%'");
		}
		Page<Map<String, Object>> pageBean = new Page<Map<String, Object>>(page.getPageNo(), page.getPageSize());
		jdbcAvicit.getDatesByPageForMap(pageBean, sbSql.toString(), parameter, null);
		return pageBean;
	}

	/**
	 * 获取生成方式
	 */
	@Override
	public Page<Map<String, Object>> getPageRuleDetailList(Paging<CbbTempletCode> page, Map<String, Object> parameter) {
		String sql = "select * from CBB_TAB_FORM_SELECT";
		Page<Map<String, Object>> pageBean = new Page<Map<String, Object>>(page.getPageNo(), page.getPageSize());
		jdbcAvicit.getDatesByPageForMap(pageBean, sql, parameter, null);
		return pageBean;
	}

	/**
	 * 获取平台通用代码子信息
	 */
	@Override
	public Page<Map<String, Object>> getPageSysCodeSonList(Paging<CbbTempletCode> page, Map<String, Object> parameter, String sysId) throws Exception{
		String cid = (String) parameter.get("cid");
		String sql = "select * from CBB_LOOKUP_V t where t.id = '" + cid + "'";
		Page<Map<String, Object>> pageBean = new Page<Map<String, Object>>(page.getPageNo(), page.getPageSize());
		jdbcAvicit.getDatesByPageForMap(pageBean, sql, parameter, null);
		return pageBean;
	}

	/**
	 * 参考模板字段信息名称唯一性验证
	 *
	 * @param name
	 * @param tId
	 * @param id
	 * @return
	 */
	@Override
	public boolean checkFieldUnique(String name, String tId, String id, String sysId) throws Exception{
		String sql = "";
		if (id == null || "".equals(id)) {
			// 新增
			sql = "select count(*) from CBB_TEMPLET_FIELD t where t.COL_NAME='" + name + "' and t.TEMPLET_ID='" + tId + "'";
		} else {
			// 编辑
			sql = "select count(*) from CBB_TEMPLET_FIELD t where t.COL_NAME='" + name + "' and t.TEMPLET_ID='" + tId + "'  and t.id <> '" + id + "'";
		}
		boolean bool = false;
		List<Object> objList = hibernateDao.findBySQL(sql);
		if (objList != null && objList.size() > 0) {
			int count = Integer.valueOf(String.valueOf(objList.get(0)));
			bool = count == 0 ? false : true;
		}
		return bool;
	}

	/***
	 * 参考模板字段信息中文名称唯一性验证
	 *
	 * @author 郭亮
	 * @param label
	 * @param tId
	 * @param id
	 * @param sysId
	 * @return boolean
	 * @throws
	 */
	@Override
	public boolean checkFieldLabelUnique(String label, String tId, String id, String sysId) {
		boolean flag = false;
		String sql = "";
		if (null == id || "".equals(id)) {
			// 新增
			sql = "select count(*) from CBB_TEMPLET_FIELD t where t.COL_LABEL='" + label + "' and t.TEMPLET_ID='" + tId + "'";
		} else {
			// 编辑
			sql = "select count(*) from CBB_TEMPLET_FIELD t where t.COL_LABEL='" + label + "' and t.TEMPLET_ID='" + tId + "'  and t.id <> '" + id + "'";
		}
		List<Object> objList = hibernateDao.findBySQL(sql);
		if (objList != null && objList.size() > 0) {
			int count = Integer.valueOf(String.valueOf(objList.get(0)));
			flag = count == 0 ? false : true;
		}
		return flag;
	}

	/**
	 * 参考模板字段信息更新操作
	 */
	@Override
	public void updateDetailCommTempletField(BeanBase bean, String sysId) throws Exception {
		CbbTempletField commTempletField = (CbbTempletField) bean;
		if (commTempletField == null) {
			throw new Exception("对象转换为cbbTempletField对象出错！");
		}
		CbbTempletField oldBean = getCommTempletFieldById(commTempletField.getId());
		hibernateDao.evict(oldBean);
		CbbTempletField newBean = new CbbTempletField();
		PojoUtil.copyProperties(newBean, oldBean, true);
		PojoUtil.copyProperties(newBean, commTempletField, true);
		if (newBean.getColLength() == null) {
			if (newBean.getColType().equals("string")) {
				BigDecimal bd = new BigDecimal(20);
				newBean.setColLength(bd);
			} else if (newBean.getColType().equals("integer")) {
				BigDecimal bd = new BigDecimal(3);
				newBean.setColLength(bd);
			}
		}
		// 查询最大排序数并赋值
		if (newBean.getColOrder() == null) {
			BigDecimal bd2 = new BigDecimal(getMaxOrderNum(newBean.getId(), sysId));
			newBean.setColOrder(bd2);
		}
		if (newBean.getColIsVisible() == null) {
			newBean.setColIsVisible("Y");
		}
		SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
		PojoUtil.setSysProperties(newBean, OpType.update);
		hibernateDao.update(newBean);
	}

	/**
	 * 手写通用代码更新操作
	 */
	@Override
	public void updateDetailCommTempletCode(BeanBase bean, String sysId) throws Exception {
		CbbTempletCode commTempletCode = (CbbTempletCode) bean;
		if (commTempletCode == null) {
			throw new Exception("对象转换为cbbTempletCode对象出错！");
		}
		CbbTempletCode oldBean = getCommTempletCodeById(commTempletCode.getId());
		hibernateDao.evict(oldBean);
		CbbTempletCode newBean = new CbbTempletCode();
		PojoUtil.copyProperties(newBean, oldBean, true);
		PojoUtil.copyProperties(newBean, commTempletCode, true);
		SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
		PojoUtil.setSysProperties(newBean, OpType.update);
		hibernateDao.update(newBean);
	}

	/**
	 * 参考模板字段信息新增操作
	 */
	@Override
	public void insertCommTempletField(CbbTempletField commTempletField, String sysId, String orgId, String deptId) throws Exception {
		if (commTempletField == null) {
			throw new Exception("对象转换为cbbTempletField对象出错！");
		}
		String id = ComUtil.getId();
		commTempletField.setId(id);
		commTempletField.setId(ComUtil.getId());
		if (commTempletField.getColLength() == null) {
			if (commTempletField.getColType().equals("string")) {
				BigDecimal bd = new BigDecimal(20);
				commTempletField.setColLength(bd);
			} else if (commTempletField.getColType().equals("integer")) {
				BigDecimal bd = new BigDecimal(3);
				commTempletField.setColLength(bd);
			}
		}
		// 查询最大排序数并赋值
		if (commTempletField.getColOrder() == null) {
			BigDecimal bd2 = new BigDecimal(getMaxOrderNum(commTempletField.getId(), sysId));
			commTempletField.setColOrder(bd2);
		}
		if (commTempletField.getColIsVisible() == null) {
			commTempletField.setColIsVisible("Y");
		}
		// 设置生成方式规则值
		if (commTempletField.getColGeneMethodRule() == null) {
			commTempletField.setColGeneMethodRule("");
		}
		// 设置显示格式
		if (commTempletField.getColShowFormat() == null) {
			commTempletField.setColShowFormat("0");
		}
		commTempletField.setOrgId(orgId);
		commTempletField.setDeptId(deptId);
		commTempletField.setSysId(sysId);
		PojoUtil.setSysProperties(commTempletField, OpType.insert);
		hibernateDao.save(commTempletField);
		SysLogUtil.log(commTempletField, null, OpType.insert, OpResult.success);
	}

	/**
	 * 参考模板代码维护新增操作
	 */
	@Override
	public void insertCommTempletCode(CbbTempletCode commTempletCode, String sysId, String orgId, String deptId) throws Exception {
		if (commTempletCode == null) {
			throw new Exception("对象转换为cbbTempletCode对象出错！");
		}
		String id = ComUtil.getId();
		commTempletCode.setId(id);
		commTempletCode.setOrgId(orgId);
		commTempletCode.setDeptId(deptId);
		commTempletCode.setSysId("1");
		PojoUtil.setSysProperties(commTempletCode, OpType.insert);
		hibernateDao.save(commTempletCode);
		SysLogUtil.log(commTempletCode, null, OpType.insert, OpResult.success);
	}

	/**
	 * 删除参考模板字段信息操作
	 *
	 * @throws Exception
	 */
	@Override
	public void deleteCommTempletField(String ids, String sysId) throws Exception {
		Assert.notNull(ids);
		String[] idArray = ids.split(",");
		for (int i = 0; i < idArray.length; i++) {
			String id = idArray[i];
			if (!"null".equals(id)) {
				// 删除未保存的新增数据时的处理方法
				CbbTempletField commTempletField = getCommTempletFieldById(id);
				if (null != commTempletField) {
					hibernateDao.delete(commTempletField);
					SysLogUtil.log(commTempletField, null, OpType.insert, OpResult.success);
				}
				// deleteCommTempletFieldById(idArray[i], sysId);
				// 级联删除通用代码信息
				String sqlc = "delete from CBB_TEMPLET_CODE t where t.field_id = '" + idArray[i] + "'";
				jdbcTemplate.update(sqlc);
				SysLogUtil.log("参考模板模块", "删除基本通用代码记录", OpType.delete, OpResult.success, LogBaseFactory.getLogBase());
				String sqls = "delete from CBB_TEMPLET_SYS_CODE t where t.field_id = '" + idArray[i] + "'";
				jdbcTemplate.update(sqls);
				SysLogUtil.log("参考模板模块", "删除系统配置通用代码记录", OpType.delete, OpResult.success, LogBaseFactory.getLogBase());
			}
		}
	}

	/**
	 * 删除模板字段信息
	 * @param id
	 * @param sysId
	 * @throws Exception void
	 * @throws
	 */
	public void deleteCommTempletFieldById(String id, String sysId) throws Exception {
		CbbTempletField commTempletField = getCommTempletFieldById(id);
		if (commTempletField == null) {
			throw new Exception("cbbTempletField对象不存在！");
		}
		hibernateDao.delete(commTempletField);
		SysLogUtil.log(commTempletField, null, OpType.delete, OpResult.success);
	}

	/**
	 * 递归获取Tree当前节点下数据
	 *
	 * @param id
	 *            当前节点
	 * @param level
	 *            需要获取的层数
	 * @return 节点集合
	 */
	@Override
	public List<TreeNode> getCommTempletInfoTreeNodes(String id, String sysId, String orgId) throws Exception{
		// 递归一层减一层
		List<TreeNode> nodes = new ArrayList<TreeNode>();

		// 查询业务数据
		List<Map<String, Object>> childTreeList = null;
		if (id.equals("-1")) {
			childTreeList = findCommTempletInfoNodesByParentId("ORG_ROOT", sysId, orgId);
		} else if (id.equals(orgId) && !id.equals("ORG_ROOT")) {
			childTreeList = getSysCommTempletInfoNodes(sysId);
		} else {
			childTreeList = findCommTempletInfoNodesByParentId(id, sysId, orgId);
		}

		// 将业务数据格式转换成esayui树形格式，此处封装了一个TreeNodeVo节点
		for (Map<String, Object> row : childTreeList) {
			String rid = (String) row.get("id");
			String rname = "";
			rname = (String) row.get("TEMP_NAME");
			String tempType = (String) row.get("TEMP_TYPE");
			BigDecimal childCount2 = BigDecimal.valueOf(Long.valueOf(row.get("CHILD_COUNT") + ""));
			TreeNode node = new TreeNode();
			node.setId(rid);
			node.setText(rname);
			// 根据节点类型,设置节点图标
			if (null != tempType && "R".equals(tempType)) { // R根节点
				node.setIconCls("icon-im-newnrootnode");
			} else if (null != tempType && "O".equals(tempType)) { // 0 组织标识
				node.setIconCls("icon-im-newnorg");
			} else if (null != tempType && "F".equals(tempType)) { // F 模板夹
				node.setIconCls("icon-im-newnmodulefile");
			} else if (null != tempType && "C".equals(tempType)) { // C 模板
				node.setIconCls("icon-im-newntable");
			} else if (null != tempType && "S".equals(tempType)) { // S 系统标识
				node.setIconCls("icon-im-newnmodulefile");
			}
			node.setAttributes(row);
			if (null != childCount2 && childCount2.longValue() > 0) {
				List<TreeNode> cnodes = getCommTempletInfoTreeNodes(rid, sysId, orgId);
				node.getChildren().addAll(cnodes);
				node.setState("open");
			} else {
				node.setState("open");
			}
			nodes.add(node);
		}
		return nodes;
	}

	/**
	 * 递归获取Tree当前节点下数据
	 *
	 * @param id
	 *            当前节点
	 * @param level
	 *            需要获取的层数
	 * @return 节点集合
	 */
	@Override
	public List<TreeNode> getCommTempletInfoTreeNodesRoot(String id, String sysId, String orgId) throws Exception{
		// 递归一层减一层
		List<TreeNode> nodes = new ArrayList<TreeNode>();
		// 查询业务数据
		List<Map<String, Object>> childTreeList = findCommTempletInfoNodesByParentId(id, sysId, orgId);
		// 将业务数据格式转换成esayui树形格式，此处封装了一个TreeNodeVo节点
		for (Map<String, Object> row : childTreeList) {
			String rid = (String) row.get("id");
			String rname = "";
			rname = (String) row.get("TEMP_NAME");
			String tempType = (String) row.get("TEMP_TYPE");
			BigDecimal childCount2 = BigDecimal.valueOf(Long.valueOf(row.get("CHILD_COUNT") + ""));
			TreeNode node = new TreeNode();
			node.setId(rid);
			node.setText(rname);
			// 根据节点类型,设置节点图标
			if (null != tempType && "R".equals(tempType)) { // R根节点
				node.setIconCls("icon-im-newnrootnode");
			} else if (null != tempType && "O".equals(tempType)) { // 0 组织标识
				node.setIconCls("icon-im-newnorg");
			} else if (null != tempType && "F".equals(tempType)) { // F 模板夹
				node.setIconCls("icon-im-newnmodulefile");
			} else if (null != tempType && "C".equals(tempType)) { // C 模板
				node.setIconCls("icon-im-newntable");
			} else if (null != tempType && "S".equals(tempType)) { // S 系统标识
				node.setIconCls("icon-im-newnmodulefile");
			}
			node.setAttributes(row);
			if (null != childCount2 && childCount2.longValue() > 0) {
				List<TreeNode> cnodes = getCommTempletInfoTreeNodesRoot(rid, sysId, orgId);
				node.getChildren().addAll(cnodes);
				node.setState("open");
			} else {
				node.setState("open");
			}
			nodes.add(node);
		}
		return nodes;
	}

	/**
	 * 获取子节点
	 *
	 * @param parentId
	 * @return
	 */
	public List<Map<String, Object>> findCommTempletInfoNodesByParentId(String parentId, String sysId, String orgId) {
		Assert.notNull(parentId, "参数不能为空！");
		String sql = "SELECT T.*,\n" + "       (SELECT COUNT(*)\n" + "          FROM CBB_TEMPLET_V F\n" + "         WHERE F.PARENT_ID = '" + parentId + "'" + " \n" + "        ) CHILD_COUNT\n" + "  FROM CBB_TEMPLET_V T\n" + " WHERE T.PARENT_ID = '" + parentId
				+ "' AND (T.SYS_ID = '" + sysId + "' OR T.SYS_ID = '-1' OR T.SYS_ID = 'O')  AND (T.ORG_ID = '" + orgId + "' OR T.ORG_ID = 'TEMPLATE_ROOT')\n" + "CONNECT BY PRIOR T.ID = T.PARENT_ID\n" + " START WITH T.PARENT_ID = '" + parentId + "'";
		return jdbcTemplate.queryForList(sql);
	}

	/**
	 * 获得当前系统信息
	 *
	 * @param parentId
	 * @return
	 */
	public List<Map<String, Object>> getSysCommTempletInfoNodes(String sysId) {
		StringBuffer query = new StringBuffer();
		query.append("SELECT T.*, \n");
		query.append("       (SELECT COUNT(*) FROM CBB_TEMPLET_V F WHERE F.PARENT_ID = 'ROOT') CHILD_COUNT \n");
		query.append("  FROM CBB_TEMPLET_V T \n");
		query.append(" WHERE (T.SYS_ID = '" + sysId + "' OR T.SYS_ID = '-1' OR T.SYS_ID = 'O') \n");
		query.append("   AND T.TEMP_TYPE = 'S' \n");

		return jdbcTemplate.queryForList(query.toString());
	}

	/**
	 * 判断是否存在根节点
	 *
	 * @return
	 */
	public int getParentNodeByParentId(String deptId) throws  Exception{
		// 获取当前人对应的组织Id
		StringBuffer sb2 = new StringBuffer();
		sb2.append("select count(*) as count from CBB_TEMPLET_INFO t \n");
		sb2.append(" where t.PARENT_ID='ROOT'");
		List<Map<String, Object>> list = jdbcTemplate.queryForList(sb2.toString());
		Map<String, Object> map = list.get(0);
		int returnCount = 0;
		returnCount = Integer.parseInt(map.get("count") + "");
		return returnCount;

	}

	/**
	 * 构建参考模板根节点
	 * @param deptId
	 * @return
	 * @throws Exception
	 * @throws
	 */
	public CbbTempletInfo saveRootLantopArchiveTabClassVByType(String deptId) throws Exception {
		// 获取当前人对应的组织Id
		StringBuffer sb1 = new StringBuffer();
		sb1.append("select t.org_id as orgId  from sys_dept t where t.id='" + deptId + "'");
		List<Map<String, Object>> list1 = jdbcTemplate.queryForList(sb1.toString());
		String orgId = list1.get(0).get("orgId") + "";
		CbbTempletInfo cbbTempletInfo = new CbbTempletInfo();
		String uuId = ComUtil.getId();
		cbbTempletInfo.setId(uuId);
		cbbTempletInfo.setTempCode("parent");
		cbbTempletInfo.setTempName("参考模板分类");
		cbbTempletInfo.setParentId("ROOT");
		cbbTempletInfo.setTempType("R");
		cbbTempletInfo.setIsSysInit("Y");
		cbbTempletInfo.setOrgId(orgId);
		cbbTempletInfo.setDeptId(deptId);
		cbbTempletInfo.setSysId("-1");
		PojoUtil.setSysProperties(cbbTempletInfo, OpType.insert);
		this.hibernateDao.save(cbbTempletInfo);
		// insertLantopArchiveClass(lantopArchiveClass);
		SysLogUtil.log(cbbTempletInfo, null, OpType.insert, OpResult.success);
		return cbbTempletInfo;
	}

	/**
	 * 获取系统标识信息
	 *
	 * @return
	 */
	@Override
	public List<CbbSysInfo> getCommSysInfo(String orgId) throws Exception {
		List<CbbSysInfo> commSysInfoList = new ArrayList<CbbSysInfo>();
		List<String> existSysIdList = this.getExistSysIdByOrgId(orgId);
		if (null != existSysIdList && existSysIdList.size() > 0) {
			String hql = "from CbbSysInfo where ID not in :id";
			commSysInfoList = hibernateDao.findByNamedParam(hql, "id", existSysIdList);
		} else {
			String hql = "from CbbSysInfo ";
			commSysInfoList = hibernateDao.find(hql);
		}
		return commSysInfoList;
	}

	/**
	 * 根据ID获取系统标识信息
	 *
	 * @return
	 */
	@Override
	public CbbSysInfo getCommSysInfoById(String id) {
		CbbSysInfo h = (CbbSysInfo) hibernateDao.getSession().get(CbbSysInfo.class, id);
		return h;
	}

	/**
	 * 手写通用代码(显示值,真实值)唯一性验证
	 *
	 * @param request
	 * @return
	 */
	@Override
	public int checkCodeUnique(String lookupName, String lookupCode, String id, String tid, String fid, String sysId) throws Exception{
		String sql = "";
		if (id == null || "".equals(id)) {
			// 新增
			// 判断系统标识是否存在 如果存在 返回 1
			sql = "select count(*) from CBB_TEMPLET_CODE t where t.LOOKUP_NAME='" + lookupName + "' and t.TEMPLET_ID = '" + tid + "' and t.FIELD_ID = '" + fid + "'";
			List<Object> objListsc = hibernateDao.findBySQL(sql);
			if (objListsc != null && objListsc.size() > 0) {
				int count = Integer.valueOf(String.valueOf(objListsc.get(0)));
				if (count != 0) {
					return 1;
				}
			}
			// 判断数据对象前缀是否存在 如果存在 返回 2
			sql = "select count(*) from CBB_TEMPLET_CODE t where t.LOOKUP_CODE='" + lookupCode + "' and t.TEMPLET_ID = '" + tid + "' and t.FIELD_ID = '" + fid + "'";
			List<Object> objListpf = hibernateDao.findBySQL(sql);
			if (objListpf != null && objListpf.size() > 0) {
				int count = Integer.valueOf(String.valueOf(objListpf.get(0)));
				if (count != 0) {
					return 2;
				}
			}
		} else {
			// 编辑
			// 判断系统标识是否存在 如果存在 返回 1
			sql = "select count(*) from CBB_TEMPLET_CODE t where t.LOOKUP_NAME='" + lookupName + "' and t.TEMPLET_ID = '" + tid + "' and t.FIELD_ID = '" + fid + "' and t.id <> '" + id + "'";
			List<Object> objListsc = hibernateDao.findBySQL(sql);
			if (objListsc != null && objListsc.size() > 0) {
				int count = Integer.valueOf(String.valueOf(objListsc.get(0)));
				if (count != 0) {
					return 1;
				}
			}
			// 判断数据对象前缀是否存在 如果存在 返回 2
			sql = "select count(*) from CBB_TEMPLET_CODE t where t.LOOKUP_CODE='" + lookupCode + "' and t.TEMPLET_ID = '" + tid + "' and t.FIELD_ID = '" + fid + "' and t.id <> '" + id + "'";
			List<Object> objListpf = hibernateDao.findBySQL(sql);
			if (objListpf != null && objListpf.size() > 0) {
				int count = Integer.valueOf(String.valueOf(objListpf.get(0)));
				if (count != 0) {
					return 2;
				}
			}
		}
		return 3;
	}

	/**
	 * 删除系统通用代码
	 */
	@Override
	public void deleteSysCode(String tid, String fid, String sysId) {
		// 删除存在的系统通用代码数据
		String sql = "delete from CBB_TEMPLET_SYS_CODE t\n" + " where t.templet_id = '" + tid + "'\n" + "   and t.field_id = '" + fid + "'";
		jdbcTemplate.update(sql);
		SysLogUtil.log("参考模板模块", "删除系统通用代码记录", OpType.delete, OpResult.success, LogBaseFactory.getLogBase());
	}

	/**
	 * 根据参考模版CODE获取参考模版ID
	 *
	 * @author 朱锋
	 * @param code
	 * @param sysId
	 * @return
	 * @throws Exception
	 *             String
	 * @throws
	 */
	@Override
	public String getTempltIdByTempltCode(String code, String sysId) throws Exception {
		String templtId = "";
		StringBuffer sbSql = new StringBuffer();
		sbSql.append("SELECT T.ID\n");
		sbSql.append("  FROM CBB_TEMPLET_INFO T\n");
		sbSql.append(" WHERE T.TEMP_CODE = '" + code + "'\n");
		sbSql.append("   AND T.SYS_ID = '" + sysId + "'");
		List<Object> objList = hibernateDao.findBySQL(sbSql.toString());
		if (objList.size() > 0) {
			templtId = String.valueOf(objList.get(0));
		}
		return templtId;
	}

	/***
	 * 查询最大排序数
	 */
	@Override
	public int getMaxOrderNum(String id, String sysId) throws Exception{
		int q = 1;
		String sql = "select max(t.col_order) from CBB_TEMPLET_FIELD t where t.templet_id = '" + id + "'";
		List<Object> objList = hibernateDao.findBySQL(sql);
		if (objList != null && objList.size() > 0) {
			if (objList.get(0) != null) {
				q = Integer.parseInt(String.valueOf(objList.get(0)));
			}
		}
		return q;
	}

	/***
	 * 更新参考模板字段方法
	 */
	@Override
	public void updateDetailCommTempletFields(CbbTempletField[] cbbTempletFields, String sysId) throws Exception {
		for (int i = 0; i < cbbTempletFields.length; i++) {
			// 转换对象
			CbbTempletField bean = cbbTempletFields[i];
			if (bean == null) {
				throw new Exception("对象转换为cbbTempletField对象出错！");
			}
			CbbTempletField oldBean = getCommTempletFieldById(bean.getId());
			hibernateDao.evict(oldBean);
			CbbTempletField newBean = new CbbTempletField();
			PojoUtil.copyProperties(newBean, oldBean, true);
			PojoUtil.copyProperties(newBean, bean, true);
			if (newBean.getColLength() == null) {
				if (newBean.getColType().equals("string")) {
					BigDecimal bd = new BigDecimal(20);
					newBean.setColLength(bd);
				} else if (newBean.getColType().equals("integer")) {
					BigDecimal bd = new BigDecimal(3);
					newBean.setColLength(bd);
				}
			}
			// 查询最大排序数并赋值
			if (newBean.getColOrder() == null) {
				BigDecimal bd2 = new BigDecimal(getMaxOrderNum(newBean.getId(), sysId));
				newBean.setColOrder(bd2);
			}
			if (newBean.getColIsVisible() == null) {
				newBean.setColIsVisible("Y");
			}
			// 设置生成方式规则值
			if (newBean.getColGeneMethodRule() == null) {
				newBean.setColGeneMethodRule("");
			}
			// 设置显示格式
			if (newBean.getColShowFormat() == null) {
				newBean.setColShowFormat("0");
			}
			// 字段转换成大写
			String colName = newBean.getColName();
			newBean.setColName(colName.toUpperCase());

			SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
			PojoUtil.setSysProperties(newBean, OpType.update);
			hibernateDao.update(newBean);
		}
	}

	/***
	 * 新增参考模板字段方法
	 */
	@Override
	public void insertCommTempletFields(CbbTempletField[] commTempletFields, String sysId, String orgId, String deptId, String templetId) throws Exception {
		for (int i = 0; i < commTempletFields.length; i++) {
			CbbTempletField commTempletField = commTempletFields[i];
			if (commTempletField == null) {
				throw new Exception("对象转换为cbbTempletField对象出错！");
			}
			// 设置属性
			String id = ComUtil.getId();
			commTempletField.setId(id);
			commTempletField.setTempletId(templetId);
			commTempletField.setColGeneMethod("0");
			commTempletField.setColShowFormat("0");
			if (commTempletField.getColLength() == null) {
				if (commTempletField.getColType().equals("string")) {
					BigDecimal bd = new BigDecimal(20);
					commTempletField.setColLength(bd);
				} else if (commTempletField.getColType().equals("integer")) {
					BigDecimal bd = new BigDecimal(3);
					commTempletField.setColLength(bd);
				} else if (commTempletField.getColType().equals("float")) {
					BigDecimal bd = new BigDecimal(16);
					commTempletField.setColLength(bd);
					if (commTempletField.getColDecimal() == null) {
						BigDecimal bdd = new BigDecimal(2);
						commTempletField.setColDecimal(bdd);
					}
				}
			}
			// 查询最大排序数并赋值
			if (commTempletField.getColOrder() == null) {
				BigDecimal bd2 = new BigDecimal(getMaxOrderNum(commTempletField.getId(), sysId));
				commTempletField.setColOrder(bd2);
			}
			if (commTempletField.getColIsVisible() == null) {
				commTempletField.setColIsVisible("Y");
			}
			commTempletField.setOrgId(orgId);
			commTempletField.setDeptId(deptId);
			commTempletField.setSysId(sysId);

			// 字段转换成大写
			String colName = commTempletField.getColName();
			commTempletField.setColName(colName.toUpperCase());

			PojoUtil.setSysProperties(commTempletField, OpType.insert);
			try {
				hibernateDao.save(commTempletField);
				SysLogUtil.log(commTempletField, null, OpType.insert, OpResult.success);
			} catch (Exception e) {
				e.printStackTrace();
				throw new Exception(e.getMessage());
			}
		}
	}

	/***
	 * 初始化字段维护 新增参考模板字段方法
	 */
	@Override
	public void insertCommTempletInitFields(CbbTempletField[] commTempletFields, String sysId, String orgId, String deptId, String templetId) throws Exception {
		for (int i = 0; i < commTempletFields.length; i++) {
			CbbTempletField commTempletField = commTempletFields[i];
			if (commTempletField == null) {
				throw new Exception("对象转换为cbbTempletField对象出错！");
			}
			// 设置属性
			String id = ComUtil.getId();
			commTempletField.setId(id);
			commTempletField.setTempletId(templetId);
			if (commTempletField.getColRuleTitle().equals("用户选择")) {
				commTempletField.setColRuleName("user");
			} else if (commTempletField.getColRuleTitle().equals("部门选择")) {
				commTempletField.setColRuleName("dept");
			} else if (commTempletField.getColRuleTitle().equals("通用代码选择")) {
				commTempletField.setColRuleName("code");
			}
			if (commTempletField.getColLength() == null) {
				if (commTempletField.getColType().equals("string")) {
					BigDecimal bd = new BigDecimal(20);
					commTempletField.setColLength(bd);
				} else if (commTempletField.getColType().equals("integer")) {
					BigDecimal bd = new BigDecimal(3);
					commTempletField.setColLength(bd);
				} else if (commTempletField.getColType().equals("float")) {
					BigDecimal bd = new BigDecimal(16);
					commTempletField.setColLength(bd);
					if (commTempletField.getColDecimal() == null) {
						BigDecimal bdd = new BigDecimal(2);
						commTempletField.setColDecimal(bdd);
					}
				}
			}
			// 查询最大排序数并赋值
			if (commTempletField.getColOrder() == null) {
				BigDecimal bd2 = new BigDecimal(getMaxOrderNum(commTempletField.getId(), sysId));
				commTempletField.setColOrder(bd2);
			}
			if (commTempletField.getColIsVisible() == null) {
				commTempletField.setColIsVisible("Y");
			}
			commTempletField.setOrgId(orgId);
			commTempletField.setDeptId(deptId);
			commTempletField.setSysId(sysId);
			PojoUtil.setSysProperties(commTempletField, OpType.insert);
			try {
				hibernateDao.save(commTempletField);
				SysLogUtil.log(commTempletField, null, OpType.insert, OpResult.success);
			} catch (Exception e) {
				e.printStackTrace();
				throw new Exception(e.getMessage());
			}
		}
	}

	/***
	 * 导出结构模板
	 */
	@Override
	public void exportExcelModule(List<String> headValue, ByteArrayOutputStream out) throws Exception {
		workbook = new HSSFWorkbook();
		this.headStyle = (HSSFCellStyle) this.workbook.createCellStyle();
		headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		headStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
		headStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		HSSFFont headfont = (HSSFFont) workbook.createFont();
		// 设置头部字体为宋体
		headfont.setFontName("宋体");
		// 粗体
		headfont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headfont.setFontHeightInPoints((short) 11);
		// 单元格样式使用字体
		this.headStyle.setFont(headfont);
		sheet = (HSSFSheet) workbook.createSheet();
		sheet.setDefaultColumnWidth(16);
		// 当前行标示
		int currentRow = 0;
		row = (HSSFRow) sheet.createRow(currentRow);
		for (int i = 0; i < headValue.size(); i++) {
			cell = (HSSFCell) row.createCell(i);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(headValue.get(i) + "");
			cell.setCellStyle(headStyle);
		}
		currentRow++;
		workbook.write(out);
		out.flush();
	}

	/***
	 * 获取导出数据
	 */
	@Override
	public List<Map<String, Object>> getCbbTempletFields(String templetId, String orgId) throws Exception {
		List<Map<String, Object>> listFields = new ArrayList<Map<String, Object>>();
		String sql = "SELECT * FROM CBB_TEMPLET_FIELD T WHERE T.ORG_ID = '" + orgId + "' AND T.TEMPLET_ID = " + "'" + templetId + "' ORDER BY T.COL_ORDER,T.COL_NAME";
		listFields = jdbcAvicit.queryForMap(sql.toString(), null);
		return listFields;
	}

	/***
	 * 导出结构数据
	 */
	@Override
	public void exportData(List<String> headValue, List<String> head, List<Map<String, Object>> data, ByteArrayOutputStream out) throws Exception {
		workbook = new HSSFWorkbook();
		this.headStyle = (HSSFCellStyle) this.workbook.createCellStyle();
		headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		headStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
		headStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		HSSFFont headfont = (HSSFFont) workbook.createFont();
		// 设置头部字体为宋体
		headfont.setFontName("宋体");
		// 粗体
		headfont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headfont.setFontHeightInPoints((short) 11);
		// 单元格样式使用字体
		this.headStyle.setFont(headfont);
		HSSFFont datafont = (HSSFFont) workbook.createFont();
		this.stringstyle = (HSSFCellStyle) this.workbook.createCellStyle();
		stringstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		stringstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		stringstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		stringstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		stringstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 单元格样式使用字体
		stringstyle.setFont(datafont);
		sheet = (HSSFSheet) workbook.createSheet();
		sheet.setDefaultColumnWidth(16);
		// 当前行标示
		int currentRow = 0;
		row = (HSSFRow) sheet.createRow(currentRow);
		for (int i = 0; i < headValue.size(); i++) {
			cell = (HSSFCell) row.createCell(i);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(headValue.get(i).toString());
			cell.setCellStyle(headStyle);
		}
		currentRow++;
		// 循环遍历数据集合增加数据行
		for (int i = 0; i < data.size(); i++) {
			// 创建数据行
			row = (HSSFRow) sheet.createRow(currentRow);
			// 设置数据行中的列
			for (int j = 0; j < head.size(); j++) {
				// 创建列
				cell = (HSSFCell) row.createCell(j);
				// 获取一个对象
				Map<String, Object> sigleData = data.get(i);
				// 设置列属性和值
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setCellStyle(stringstyle);
				// 填值时做对应的转换
				String value = sigleData.get(head.get(j)) == null ? "" : sigleData.get(head.get(j)) + "";
				if ("string".equals(value)) {
					value = "字符串";
				} else if ("integer".equals(value)) {
					value = "整型";
				} else if ("float".equals(value)) {
					value = "浮点型";
				} else if ("date".equals(value)) {
					value = "日期时间型";
				} else if ("blob".equals(value)) {
					value = "BLOB";
				} else if ("clob".equals(value)) {
					value = "CLOB";
				} else if ("Y".equals(value)) {
					value = "是";
				} else if ("N".equals(value)) {
					value = "否";
				}
				// 初始化字段导出时，下拉类型值转换
				if (head.get(j).equals("COL_DROPDOWN_TYPE")) {
					if (value.equals("0")) {
						value = "无";
					} else if (value.equals("1")) {
						value = "参选";
					} else if (value.equals("2")) {
						value = "只选";
					} else if (value.equals("3")) {
						value = "选择";
					}
				}
				/*
				 * // 初始化字段导出时，生成方式值转换 if (head.get(j).equals("COL_GENE_METHOD")) { if (value.equals("0")) { value = "空"; } else if (value.equals("1")) { value = "默认值"; } else if
				 * (value.equals("2")) { value = "序列"; } else if (value.equals("3")) { value = "顺带"; } else if (value.equals("4")) { value = "组合项"; } else if (value.equals("5")) {
				 * value = "统计生成"; } }
				 */
				cell.setCellValue(value);
			}
			// 下一行
			currentRow++;
		}
		workbook.write(out);
		out.flush();
	}

	/***
	 * 构造导出文件名
	 */
	@Override
	public String getFileName(String id) throws Exception {
		String sql = "SELECT T.TEMP_NAME FROM CBB_TEMPLET_INFO T WHERE T.ID = " + "'" + id + "'";
		List<String> fileNames = hibernateDao.findBySQL(sql);
		if (fileNames.size() != 0 && fileNames != null) {
			return fileNames.get(0) + "";
		}
		return "";
	}

	/***
	 * 解析 excel2003 文件
	 */
	@Override
	public Map<String, Vector<Vector<String>>> readXls(String fileName) throws IOException {
		InputStream is = new FileInputStream(fileName);
		HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
		Vector<Vector<String>> sheetNames = new Vector<Vector<String>>();
		Vector<String> sheetName = new Vector<String>();
		int columns = 0;
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			Vector<Vector<String>> list = new Vector<Vector<String>>();
			HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}
			sheetName.add(hssfSheet.getSheetName());
			for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow == null) {
					continue;
				}
				if (rowNum == 0) {
					columns = hssfRow.getLastCellNum();
				}
				Vector<String> title = new Vector<String>();
				Vector<String> row = new Vector<String>();
				for (int cellNum = 0; cellNum < columns; cellNum++) {
					HSSFCell hssfCell = hssfRow.getCell(cellNum);
					if (rowNum == 0) {
						title.add(getxlsValue(hssfCell));
						title.add(getxlsCellType(hssfCell));
					} else {
						row.add(getxlsValue(hssfCell));
					}
				}
				if (rowNum == 0) {
					list.add(title);
				} else {
					list.add(row);
				}
			}
			sheetXls.put(hssfSheet.getSheetName(), list);
		}
		sheetNames.add(sheetName);
		sheetXls.put("sheetNames", sheetNames);
		return sheetXls;
	}

	/**
	 * 获取 excel2003 文件列值
	 *
	 * @author 朱锋
	 * @param hssfCell
	 * @return String
	 * @throws
	 */
	@SuppressWarnings("static-access")
	public String getxlsValue(HSSFCell hssfCell) {
		SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd ");
		if (hssfCell == null) {
			return "";
		}
		if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(hssfCell.getBooleanCellValue());
		} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
			if (DateUtil.isCellDateFormatted(hssfCell)) {
				Date date = hssfCell.getDateCellValue();
				return sdf.format(date).trim();
			} else {
				return String.valueOf(hssfCell.getNumericCellValue()).trim();
			}
		} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_STRING) {
			return String.valueOf(hssfCell.getStringCellValue()).trim();
		} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BLANK) {
			return "";
		}
		return "";
	}

	/**
	 * 获取 excel2003 文件列类型
	 *
	 * @param hssfCell
	 * @return String
	 */
	@SuppressWarnings("static-access")
	public String getxlsCellType(HSSFCell hssfCell) {
		if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
			return "整形";
		} else {
			return "字符串";
		}
	}

	/***
	 * 解析 excel2007 文件
	 */
	@Override
	public Map<String, Vector<Vector<String>>> readXlsx(String fileName) throws Exception {
		InputStream is = new FileInputStream(fileName);
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
		Vector<Vector<String>> sheetNames = new Vector<Vector<String>>();
		Vector<String> sheetName = new Vector<String>();
		int columns = 0;
		for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
			Vector<Vector<String>> vector2007 = new Vector<Vector<String>>();
			XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
			if (xssfSheet == null) {
				continue;
			}
			sheetName.add(xssfSheet.getSheetName());
			// 循环每一行
			for (int rowNum = 0; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
				if (xssfRow == null) {
					continue;
				}
				if (rowNum == 0) { // 列总数
					columns = xssfRow.getLastCellNum();
				}
				Vector<String> title = new Vector<String>();
				Vector<String> row = new Vector<String>();
				// 循环每一列
				for (int cellNum = 0; cellNum < columns; cellNum++) {
					XSSFCell xssfCell = xssfRow.getCell(cellNum);
					if (rowNum == 0) { // 标题行
						// 值
						title.add(getxlsxValue(xssfCell));
						// 类型
						title.add(getxlsxCellType(xssfCell));
					} else { // 数据行
						row.add(getxlsxValue(xssfCell));
					}
				}
				if (rowNum == 0) {
					vector2007.add(title);
				} else {
					vector2007.add(row);
				}
			}
			sheetXlsx.put(xssfSheet.getSheetName(), vector2007.size() > 0 ? vector2007 : new Vector<Vector<String>>());
		}
		sheetNames.add(sheetName);
		sheetXlsx.put("sheetNames", sheetNames);
		return sheetXlsx;
	}

	/***
	 * 获取 excel2007 文件列值
	 *
	 * @param xssfCell
	 * @return
	 */
	@SuppressWarnings("static-access")
	public String getxlsxValue(XSSFCell xssfCell) {
		SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd ");
		if (xssfCell == null) {
			return "";
		}
		if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(xssfCell.getBooleanCellValue());
		} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
			if (DateUtil.isCellDateFormatted(xssfCell)) {
				Date date = xssfCell.getDateCellValue();
				return sdf.format(date).trim();
			} else {
				return String.valueOf(xssfCell.getNumericCellValue()).trim();
			}
		} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_STRING) {
			return String.valueOf(xssfCell.getStringCellValue()).trim();
		} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BLANK) {
			return "";
		}
		return "";
	}

	/***
	 * 获取 excel2007 文件列类型
	 *
	 * @param xssfCell
	 * @return
	 */
	@SuppressWarnings("static-access")
	public String getxlsxCellType(XSSFCell xssfCell) {
		if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
			return "整形";
		} else {
			return "字符串";
		}
	}

	/***
	 * 判断excel文件数据合法性
	 */
	@Override
	public void testExcel(Vector<Vector<String>> datas, String templetId) throws Exception {
		// 查找数据库中已存在的【字段名】
		String sql = "SELECT T.COL_NAME FROM CBB_TEMPLET_FIELD T WHERE T.TEMPLET_ID = " + "'" + templetId + "'";
		List<String> existName = hibernateDao.findBySQL(sql);
		// 数据集合中的字段名
		List<String> nameList = new ArrayList<String>();
		for (int j = 1; j < datas.size(); j++) {
			try {
				/*** 一行数据 ***/
				Vector<String> row = datas.get(j);
				String name = row.get(1);
				String type = row.get(2);
				String length = row.get(3).replace(".0", "");
				String decimal = row.get(4).replace(".0", "");
				String colIsDisplay = row.get(5);
				String isMust = row.get(6);
				String isVisible = row.get(7);
				String isEdit = row.get(8);
				String isTabVisible = row.get(9);
				String isDetail = row.get(10);
				String isSearch = row.get(11);
				String dropdownType = row.get(12);
				String order = row.get(13).replace(".0", "");
				/*** 检验表中是否已存在【字段名】 ***/
				if (existName.contains(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 在数据库中已存在，请查证");
				}
				/*** 检验数据集合中是否存在重复的【字段名】 ***/
				if (nameList.contains(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 在文件中已存在，请查证");
				}
				// 将lookupCode放入集合用重复检验
				nameList.add(name);
				/*** 检验数据格式 ***/
				// 【字段名】 字母、数字、下划线组成，必须以字母开头
				if (!testString(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 应由字母、数字、下划线组成，必须以字母开头。请查证");
				}
				// 【字段类型】字符串、整型、浮点型、日期时间型、BLOB、CLOB
				if (!(type.equals("字符串") || type.equals("整型") || type.equals("浮点型") || type.equals("日期时间型") || type.equals("BLOB") || type.equals("CLOB"))) {
					throw new Exception("第" + (j + 1) + "行第3列，【字段类型】" + type + " 应为 【字符串、整型、浮点型、日期时间型、BLOB、CLOB】中的一种。请查证");
				}
				// 【长度】(除日期,BLOB,CLOB类型数据，长度必填)
				if (!type.equals("日期时间型") && !type.equals("BLOB") && !type.equals("CLOB")) {
					if (!testFigure(length)) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 应为正整型数字。请查证");
					}
				}
				// 【小数位数】必须为正整型数字，只能为浮点数时填写
				if (!type.equals("浮点型")) {
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，【类型】" + type + " 没有小数位数。请查证");
					}
				}
				// 【是否可见】必须为【是】或【否】
				if (!(colIsDisplay.equals("是") || colIsDisplay.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第6列，【是否可见】" + isMust + " 应为【是】或【否】。请查证");
				}
				// 【是否必著】必须为【是】或【否】
				if (!(isMust.equals("是") || isMust.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第7列，【是否必著】" + isMust + " 应为【是】或【否】。请查证");
				}
				// 【是否显示】必须为【是】或【否】
				if (!(isVisible.equals("是") || isVisible.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第8列，【是否显示】" + isVisible + " 应为【是】或【否】。请查证");
				}
				// 【是否编辑】必须为【是】或【否】
				if (!(isEdit.equals("是") || isEdit.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第9列，【是否编辑】" + isEdit + " 应为【是】或【否】。请查证");
				}
				// 【是否列表显示】必须为【是】或【否】
				if (!(isTabVisible.equals("是") || isTabVisible.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第10列，【是否列表显示】" + isTabVisible + " 应为【是】或【否】。请查证");
				}
				// 【是否详细显示】必须为【是】或【否】
				if (!(isDetail.equals("是") || isDetail.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第11列，【是否详细显示】" + isDetail + " 应为【是】或【否】。请查证");
				}
				// 【查询字段】必须为【是】或【否】
				if (!(isSearch.equals("是") || isSearch.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第12列，【查询字段】" + isSearch + " 应为【是】或【否】。请查证");
				}
				// 【下拉类型】必须为【无】或【参选】或【只选】或【选择】
				if (!(dropdownType.equals("无") || dropdownType.equals("参选") || dropdownType.equals("只选") || dropdownType.equals("选择"))) {
					throw new Exception("第" + (j + 1) + "行第12列，【下拉类型】" + dropdownType + " 应为【无】或【参选】或【只选】或【选择】。请查证");
				}
				// 【顺序】必须为正整型数字
				if (!testFigure(order)) {
					throw new Exception("第" + (j + 1) + "行第13列，【顺序】" + order + " 应为正整型数字。请查证");
				}
				/*** 逻辑校验 ***/
				// 类型为字符串时，长度必填，最大4000，小数位数 不能填
				if (type.equals("字符串")) {
					if (Integer.parseInt(length) > 4000) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于4000。请查证");
					}
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，字符串没有小数位数。请查证");
					}
				}
				// 类型为整型是，长度必填，最大16，小数位数 不能填
				if (type.equals("整型")) {
					if (Integer.parseInt(length) > 16) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于16。请查证");
					}
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，整型没有【小数位数】。请查证");
					}
				}
				// 类型为浮点数时，长度必填，最大16，小数位数必填，最大6
				if (type.equals("浮点型")) {
					if (Integer.parseInt(length) > 16) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于16。请查证");
					}
					if (!testFigure(decimal)) {
						throw new Exception("第" + (j + 1) + "行第5列，浮点型的【小数位数】不能为空且必须是正整数。请查证");
					}
					if (Integer.parseInt(decimal) > 6) {
						throw new Exception("第" + (j + 1) + "行第4列，【小数位数】" + decimal + " 不能大于6。请查证");
					}
				}
			} catch (ArrayIndexOutOfBoundsException ae) {
				throw new Exception("导入数据不合法，请在模板中填写数据！");
			} catch (Exception e) {
				throw new Exception("导入数据不合法，请在模板中填写数据！");
			}
		}

	}

	/***
	 * 整型数字 正则验证
	 *
	 * @param order
	 * @return
	 */
	public boolean testFigure(String figure) {
		// 正则表达式字符串
		String regx = "^[0-9]+$";
		// 定义pattern解释要使用的正则表达式
		Pattern pt = Pattern.compile(regx);
		// 使用Matcher来对比
		Matcher mt = pt.matcher(figure);
		// 对比后返回对比结果
		return mt.matches();
	}

	/***
	 * 数字、字母、下划线 正则验证
	 *
	 * @param lookup
	 * @return
	 */
	public boolean testString(String str) {
		// 正则表达式字符串
		String regx = "^[a-zA-Z][0-9a-zA-Z_]*$";
		// 定义pattern解释要使用的正则表达式
		Pattern pt = Pattern.compile(regx);
		// 使用Matcher来对比
		Matcher mt = pt.matcher(str);
		// 对比后返回对比结果
		return mt.matches();
	}

	/***
	 * 将excel中的数据添加到数据库中
	 */
	@Override
	public void insertFromExcel(Vector<Vector<String>> datas, String sysId, String orgId, String deptId, String templetId) throws Exception {
		if (datas.size() > 0) {
			CbbTempletField[] cbbTempletFields = new CbbTempletField[datas.size() - 1];
			for (int j = 1; j < datas.size(); j++) {
				// 将数据转换成对象
				Vector<String> row = datas.get(j);
				String label = row.get(0);
				String name = row.get(1);
				String type = row.get(2);
				String length = row.get(3).replace(".0", "");
				String decimal = row.get(4).replace(".0", "");
				String colIsDisplay = row.get(5);
				String isMust = row.get(6);
				String isVisible = row.get(7);
				String isEdit = row.get(8);
				String isTabVisible = row.get(9);
				String isDetail = row.get(10);
				String isSearch = row.get(11);
				String dropdownType = row.get(12);
				String order = row.get(13).replace(".0", "");
				String remark = row.get(14);
				// 初始化对象
				CbbTempletField cbbTempltField = new CbbTempletField();
				cbbTempltField.setColName(name);
				cbbTempltField.setColLabel(label);
				if (type.equals("字符串")) {
					cbbTempltField.setColType("string");
				} else if (type.equals("整型")) {
					cbbTempltField.setColType("integer");
				} else if (type.equals("浮点型")) {
					cbbTempltField.setColType("float");
				} else if (type.equals("日期时间型")) {
					cbbTempltField.setColType("date");
				} else if (type.equals("BLOB")) {
					cbbTempltField.setColType("blob");
				} else if (type.equals("CLOB")) {
					cbbTempltField.setColType("clob");
				}
				if (!length.equals("")) {
					cbbTempltField.setColLength(new BigDecimal(Integer.parseInt(length)));
				}
				if (!decimal.equals("")) {
					cbbTempltField.setColDecimal(new BigDecimal(Integer.parseInt(decimal)));
				}
				// 系统字段设置为N
				cbbTempltField.setColIsSys("N");
				cbbTempltField.setColOrder(new BigDecimal(Integer.parseInt(order)));
				if (isMust.equals("是")) {
					cbbTempltField.setColIsMust("Y");
				} else if (isMust.equals("否")) {
					cbbTempltField.setColIsMust("N");
				}
				if (isVisible.equals("是")) {
					cbbTempltField.setColIsVisible("Y");
				} else if (isVisible.equals("否")) {
					cbbTempltField.setColIsVisible("N");
				}
				if (isSearch.equals("是")) {
					cbbTempltField.setColIsSearch("Y");
				} else if (isSearch.equals("否")) {
					cbbTempltField.setColIsSearch("N");
				}
				if (isEdit.equals("是")) {
					cbbTempltField.setColIsEdit("Y");
				} else if (isEdit.equals("否")) {
					cbbTempltField.setColIsEdit("N");
				}
				if (isTabVisible.equals("是")) {
					cbbTempltField.setColIsTabVisible("Y");
				} else if (isTabVisible.equals("否")) {
					cbbTempltField.setColIsTabVisible("N");
				}
				if (isDetail.equals("是")) {
					cbbTempltField.setColIsDetail("Y");
				} else if (isDetail.equals("否")) {
					cbbTempltField.setColIsDetail("N");
				}
				// 设置是否可见
				if (colIsDisplay.equals("是")) {
					cbbTempltField.setColIsDisplay("Y");
				} else if (colIsDisplay.equals("否")) {
					cbbTempltField.setColIsDisplay("N");
				}
				cbbTempltField.setRemark(remark);
				// 设置下拉类型
				if ("无".equals(dropdownType)) {
					cbbTempltField.setColDropdownType("0");
				} else if ("参选".equals(dropdownType)) {
					cbbTempltField.setColDropdownType("1");
				} else if ("只选".equals(dropdownType)) {
					cbbTempltField.setColDropdownType("2");
				} else if ("选择".equals(dropdownType)) {
					cbbTempltField.setColDropdownType("3");
				}
				// 把对象添加到对象数组中
				cbbTempletFields[j - 1] = cbbTempltField;
			}
			// 调用方法添加数据
			insertCommTempletFields(cbbTempletFields, sysId, orgId, deptId, templetId);
		}
	}

	/***
	 * 初始化字段维护导入判断excel文件数据合法性 判断下拉类型，生成方式，生成规则判断
	 */
	@Override
	public void initFieldTestExcel(Vector<Vector<String>> datas, String templetId) throws Exception {
		// 查找数据库中已存在的【字段名】
		String sql = "SELECT T.COL_NAME FROM CBB_TEMPLET_FIELD T WHERE T.TEMPLET_ID = " + "'" + templetId + "'";
		List<String> existName = hibernateDao.findBySQL(sql);
		// 数据集合中的字段名
		List<String> nameList = new ArrayList<String>();
		for (int j = 1; j < datas.size(); j++) {
			try {
				/*** 一行数据 ***/
				Vector<String> row = datas.get(j);
				String name = row.get(1);
				String type = row.get(2);
				String length = row.get(3).replace(".0", "");
				String decimal = row.get(4).replace(".0", "");
				String colIsDisplay = row.get(5);
				String isMust = row.get(6);
				String isVisible = row.get(7);
				String isEdit = row.get(8);
				String isTabVisible = row.get(9);
				String isDetail = row.get(10);
				String isSearch = row.get(11);
				String dorpDownType = row.get(12);// 下拉类型
				/*
				 * String geneMethod = row.get(13);// 生成方式 String ruleTitle = row.get(14);// 生成规则
				 */
				String order = row.get(13).replace(".0", "");
				/*** 检验表中是否已存在【字段名】 ***/
				if (existName.contains(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 在数据库中已存在，请查证");
				}
				/*** 检验数据集合中是否存在重复的【字段名】 ***/
				if (nameList.contains(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 在文件中已存在，请查证");
				}
				// 将lookupCode放入集合用重复检验
				nameList.add(name);
				/*** 检验数据格式 ***/
				// 【字段名】 字母、数字、下划线组成，必须以字母开头
				if (!testString(name)) {
					throw new Exception("第" + (j + 1) + "行第2列，【字段名】" + name + " 应由字母、数字、下划线组成，必须以字母开头。请查证");
				}
				// 【字段类型】字符串、整型、浮点型、日期时间型、BLOB、CLOB
				if (!(type.equals("字符串") || type.equals("整型") || type.equals("浮点型") || type.equals("日期时间型") || type.equals("BLOB") || type.equals("CLOB"))) {
					throw new Exception("第" + (j + 1) + "行第3列，【字段类型】" + type + " 应为 【字符串、整型、浮点型、日期时间型、BLOB、CLOB】中的一种。请查证");
				}
				// 【长度】(除日期,BLOB,CLOB类型数据，长度必填)
				if (!type.equals("日期时间型") && !type.equals("BLOB") && !type.equals("CLOB")) {
					if (!testFigure(length)) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 应为正整型数字。请查证");
					}
				}
				// 【小数位数】必须为正整型数字，只能为浮点数时填写
				if (!type.equals("浮点型")) {
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，【类型】" + type + " 没有小数位数。请查证");
					}
				}
				// 【是否可见】必须为【是】或【否】
				if (!(colIsDisplay.equals("是") || colIsDisplay.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第6列，【是否可见】" + isMust + " 应为【是】或【否】。请查证");
				}
				// 【是否必著】必须为【是】或【否】
				if (!(isMust.equals("是") || isMust.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第7列，【是否必著】" + isMust + " 应为【是】或【否】。请查证");
				}
				// 【是否显示】必须为【是】或【否】
				if (!(isVisible.equals("是") || isVisible.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第8列，【是否显示】" + isVisible + " 应为【是】或【否】。请查证");
				}
				// 【是否编辑】必须为【是】或【否】
				if (!(isEdit.equals("是") || isEdit.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第9列，【是否编辑】" + isEdit + " 应为【是】或【否】。请查证");
				}
				// 【是否列表显示】必须为【是】或【否】
				if (!(isTabVisible.equals("是") || isTabVisible.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第10列，【是否列表显示】" + isTabVisible + " 应为【是】或【否】。请查证");
				}
				// 【是否详细显示】必须为【是】或【否】
				if (!(isDetail.equals("是") || isDetail.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第11列，【是否详细显示】" + isDetail + " 应为【是】或【否】。请查证");
				}
				// 【查询字段】必须为【是】或【否】
				if (!(isSearch.equals("是") || isSearch.equals("否"))) {
					throw new Exception("第" + (j + 1) + "行第12列，【查询字段】" + isSearch + " 应为【是】或【否】。请查证");
				}
				// 【下拉类型】必须是【无】、【只选】、【参选】、【选择】其中一种
				if (!(dorpDownType.equals("无") || dorpDownType.equals("只选") || dorpDownType.equals("参选") || dorpDownType.equals("选择"))) {
					throw new Exception("第" + (j + 1) + "行第13列，【下拉类型】" + dorpDownType + " 应为【无】、【只选】、【参选】、【选择】其中一种。请查证");
				}
				/*
				 * // 【生成方式】必须是【空】、【默认值】、【序列】、【顺带】、【组合项】、【统计生成】中的一种 if (!(geneMethod.equals("空") || geneMethod.equals("只选") || geneMethod.equals("序列") || geneMethod.equals("顺带") ||
				 * geneMethod.equals("组合项") || geneMethod.equals("同级生成"))) { throw new Exception("第" + (j + 1) + "行第14列，【生成方式】" + geneMethod +
				 * " 应为【空】、【默认值】、【序列】、【顺带】、【组合项】、【统计生成】其中一种。请查证"); } // 【生成规则】必须是【用户选择】、【部门选择】、【通用代码选择】中的一种 if (!(ruleTitle.equals("用户选择") || ruleTitle.equals("部门选择") || ruleTitle
				 * .equals("通用代码选择"))) { throw new Exception("第" + (j + 1) + "行第15列，【生成规则】" + ruleTitle + " 应为【用户选择】、【部门选择】、【通用代码选择】其中一种。请查证"); }
				 */
				// 【顺序】必须为正整型数字
				if (!testFigure(order)) {
					throw new Exception("第" + (j + 1) + "行第17列，【顺序】" + order + " 应为正整型数字。请查证");
				}
				/*** 逻辑校验 ***/
				// 类型为字符串时，长度必填，最大4000，小数位数 不能填
				if (type.equals("字符串")) {
					if (Integer.parseInt(length) > 4000) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于4000。请查证");
					}
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，字符串没有小数位数。请查证");
					}
				}
				// 类型为整型是，长度必填，最大16，小数位数 不能填
				if (type.equals("整型")) {
					if (Integer.parseInt(length) > 16) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于16。请查证");
					}
					if (!decimal.equals("")) {
						throw new Exception("第" + (j + 1) + "行第5列，整型没有【小数位数】。请查证");
					}
				}
				// 类型为浮点数时，长度必填，最大16，小数位数必填，最大6
				if (type.equals("浮点型")) {
					if (Integer.parseInt(length) > 16) {
						throw new Exception("第" + (j + 1) + "行第4列，【长度】" + length + " 不能大于16。请查证");
					}
					if (!testFigure(decimal)) {
						throw new Exception("第" + (j + 1) + "行第5列，浮点型的【小数位数】不能为空且必须是正整数。请查证");
					}
					if (Integer.parseInt(decimal) > 6) {
						throw new Exception("第" + (j + 1) + "行第4列，【小数位数】" + decimal + " 不能大于6。请查证");
					}
				}
			} catch (ArrayIndexOutOfBoundsException ae) {
				throw new Exception("导入数据不合法，请在模板中填写数据！");
			} catch (Exception e) {
				throw new Exception(e.getMessage());
			}
		}
	}

	/***
	 * 初始化字段维护导入 将excel中的数据添加到数据库中 设置下拉类型，生成方式，生成规则
	 */
	@Override
	public void initFieldInsertFromExcel(Vector<Vector<String>> datas, String sysId, String orgId, String deptId, String templetId) throws Exception {
		if (datas.size() > 0) {
			for (int j = 1; j < datas.size(); j++) {
				// 将数据转换成对象
				Vector<String> row = datas.get(j);
				String label = row.get(0);
				String name = row.get(1);
				String type = row.get(2);
				String length = row.get(3).replace(".0", "");
				String decimal = row.get(4).replace(".0", "");
				String colIsDisplay = row.get(5);
				String isMust = row.get(6);
				String isVisible = row.get(7);
				String isEdit = row.get(8);
				String isTabVisible = row.get(9);
				String isDetail = row.get(10);
				String isSearch = row.get(11);
				String dorpDownType = row.get(12);// 下拉类型
				/*
				 * String geneMethod = row.get(13);// 生成方式 String ruleTitle = row.get(14);// 生成规则
				 */
				String order = row.get(13).replace(".0", "");
				String remark = row.get(14);
				// 初始化对象
				CbbTempletField cbbTempltField = new CbbTempletField();
				cbbTempltField.setTempletId(templetId);
				cbbTempltField.setColName(name);
				cbbTempltField.setColLabel(label);
				if (type.equals("字符串")) {
					cbbTempltField.setColType("string");
				} else if (type.equals("整型")) {
					cbbTempltField.setColType("integer");
				} else if (type.equals("浮点型")) {
					cbbTempltField.setColType("float");
				} else if (type.equals("日期时间型")) {
					cbbTempltField.setColType("date");
				} else if (type.equals("BLOB")) {
					cbbTempltField.setColType("blob");
				} else if (type.equals("CLOB")) {
					cbbTempltField.setColType("clob");
				}
				if (!length.equals("")) {
					cbbTempltField.setColLength(new BigDecimal(Integer.parseInt(length)));
				}
				if (!decimal.equals("")) {
					cbbTempltField.setColDecimal(new BigDecimal(Integer.parseInt(decimal)));
				}
				// 将系统字段设置为Y
				cbbTempltField.setColIsSys("Y");
				if (colIsDisplay.equals("是")) {
					cbbTempltField.setColIsDisplay("Y");
				} else if (colIsDisplay.equals("否")) {
					cbbTempltField.setColIsDisplay("N");
				}
				if (isMust.equals("是")) {
					cbbTempltField.setColIsMust("Y");
				} else if (isMust.equals("否")) {
					cbbTempltField.setColIsMust("N");
				}
				if (isVisible.equals("是")) {
					cbbTempltField.setColIsVisible("Y");
				} else if (isVisible.equals("否")) {
					cbbTempltField.setColIsVisible("N");
				}
				if (isEdit.equals("是")) {
					cbbTempltField.setColIsEdit("Y");
				} else if (isEdit.equals("否")) {
					cbbTempltField.setColIsEdit("N");
				}
				if (isTabVisible.equals("是")) {
					cbbTempltField.setColIsTabVisible("Y");
				} else if (isTabVisible.equals("否")) {
					cbbTempltField.setColIsTabVisible("N");
				}
				if (isDetail.equals("是")) {
					cbbTempltField.setColIsDetail("Y");
				} else if (isDetail.equals("否")) {
					cbbTempltField.setColIsDetail("N");
				}
				if (isSearch.equals("是")) {
					cbbTempltField.setColIsSearch("Y");
				} else if (isSearch.equals("否")) {
					cbbTempltField.setColIsSearch("N");
				}
				// 设置下拉类型
				if (dorpDownType.equals("无")) {
					cbbTempltField.setColDropdownType("0");
				} else if (dorpDownType.equals("参选")) {
					cbbTempltField.setColDropdownType("1");
				} else if (dorpDownType.equals("只选")) {
					cbbTempltField.setColDropdownType("2");
				} else if (dorpDownType.equals("选择")) {
					cbbTempltField.setColDropdownType("3");
				}
				cbbTempltField.setColGeneMethod("0");
				/*
				 * // 设置生成方式 if (geneMethod.equals("空")) { cbbTempltField.setColGeneMethod("0"); } else if (geneMethod.equals("默认值")) { cbbTempltField.setColGeneMethod("1"); } else
				 * if (geneMethod.equals("序列")) { cbbTempltField.setColGeneMethod("2"); } else if (geneMethod.equals("顺带")) { cbbTempltField.setColGeneMethod("3"); } else if
				 * (geneMethod.equals("组合项")) { cbbTempltField.setColGeneMethod("4"); } else if (geneMethod.equals("统计生成")) { cbbTempltField.setColGeneMethod("5"); } //
				 * 设置生成规则【用户选择】、【部门选择】、【通用代码选择】 cbbTempltField.setColRuleTitle(ruleTitle.toString()); if (ruleTitle.equals("用户选择")) { cbbTempltField.setColRuleName("user"); } else
				 * if (ruleTitle.equals("部门选择")) { cbbTempltField.setColRuleName("dept"); } else if (ruleTitle.equals("通用代码选择")) { cbbTempltField.setColRuleName("code"); }
				 */
				cbbTempltField.setColOrder(new BigDecimal(Integer.parseInt(order)));
				cbbTempltField.setRemark(remark);
				// 调用方法添加数据
				insertCommTempletField(cbbTempltField, sysId, orgId, deptId);
			}
		}
	}

	/**
	 * 参考模板初始化字段新增方法
	 *
	 * @author 朱锋
	 * @param commTempletFields
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param templetId
	 * @param treeId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void insertCbbTempletFieldArray(CbbTempletField[] cbbTempletFields, String sysId, String orgId, String deptId, String templetId) throws Exception {
		for (int i = 0; i < cbbTempletFields.length; i++) {
			CbbTempletField cbbTempletField = cbbTempletFields[i];
			CbbTempletField cbbTempletFieldTemp = new CbbTempletField();
			PojoUtil.copyProperties(cbbTempletFieldTemp, cbbTempletField, true);
			String id = ComUtil.getId();
			cbbTempletFieldTemp.setId(id);
			cbbTempletFieldTemp.setTempletId(templetId);
			cbbTempletFieldTemp.setOrgId(orgId);
			cbbTempletFieldTemp.setDeptId(deptId);
			cbbTempletFieldTemp.setSysId(sysId);
			cbbTempletFieldTemp.setColGeneMethod("0");
			if (!checkFieldUnique(cbbTempletFieldTemp.getColName(), templetId, "", sysId)) {
				// 转换字段名为大写
				String colName = cbbTempletFieldTemp.getColName();
				cbbTempletFieldTemp.setColName(colName.toUpperCase());

				PojoUtil.setSysProperties(cbbTempletFieldTemp, OpType.insert);
				try {
					hibernateDao.save(cbbTempletFieldTemp);
					SysLogUtil.log(cbbTempletFieldTemp, null, OpType.insert, OpResult.success);
				} catch (Exception e) {
					e.printStackTrace();
					throw new Exception(e.getMessage());
				}
			}
		}
	}

	/**
	 * 参考模板初始化字段更新方法
	 *
	 * @author 朱锋
	 * @param cbbTempletFields
	 * @param templetId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void updateCbbTempletFieldArray(CbbTempletField[] cbbTempletFields, String templetId, String sysId) throws Exception {
		for (int i = 0; i < cbbTempletFields.length; i++) {
			CbbTempletField cbbTempletField = cbbTempletFields[i];
			if (!checkFieldUnique(cbbTempletField.getColName(), templetId, cbbTempletField.getId(), sysId)) {
				CbbTempletField oldBean = getCommTempletFieldById(cbbTempletField.getId());
				hibernateDao.evict(oldBean);
				CbbTempletField newBean = new CbbTempletField();
				PojoUtil.copyProperties(newBean, oldBean, true);
				PojoUtil.copyProperties(newBean, cbbTempletField, true);
				// 转换字段名为大写
				String colName = newBean.getColName();
				newBean.setColName(colName.toUpperCase());

				SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
				PojoUtil.setSysProperties(newBean, OpType.update);
				hibernateDao.update(newBean);
			}
		}

	}

	/**
	 * 参考模板初始化字段通用代码新增方法
	 *
	 * @author 朱锋
	 * @param CbbTempletCodes
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param templetId
	 * @param fieldId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void insertCbbTempletFieldCodeArray(String inserCodeData, String sysId, String orgId, String deptId, String templetId, String fieldId) throws Exception {
		JSONArray ja = JSONArray.fromObject(inserCodeData);
		for (int i = 0; i < ja.size(); i++) {
			JSONObject jj = JSONObject.fromObject(ja.get(i));
			String lookupName = jj.getString("LOOKUP_NAME");
			String lookupCode = jj.getString("LOOKUP_CODE");
			String codeIsValid = jj.getString("CODE_IS_VALID");
			String codeOrder = jj.getString("CODE_ORDER");
			CbbTempletCode cbbTempletCode = new CbbTempletCode();
			String id = ComUtil.getId();
			cbbTempletCode.setId(id);
			cbbTempletCode.setTempletId(templetId);
			cbbTempletCode.setFieldId(fieldId);
			cbbTempletCode.setOrgId(orgId);
			cbbTempletCode.setDeptId(deptId);
			cbbTempletCode.setSysId(sysId);
			cbbTempletCode.setLookupName(lookupName);
			cbbTempletCode.setLookupCode(lookupCode);
			cbbTempletCode.setCodeIsValid(codeIsValid);
			BigDecimal codeOrderb = new BigDecimal(codeOrder);
			cbbTempletCode.setCodeOrder(codeOrderb);
			PojoUtil.setSysProperties(cbbTempletCode, OpType.insert);
			try {
				hibernateDao.save(cbbTempletCode);
				SysLogUtil.log(cbbTempletCode, null, OpType.insert, OpResult.success);
			} catch (Exception e) {
				e.printStackTrace();
				throw new Exception(e.getMessage());
			}
		}
	}

	/**
	 * 参考模板初始化字段通用代码更新方法
	 *
	 * @author 朱锋
	 * @param CbbTempletCodes
	 * @param templetId
	 * @param fieldId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void updateCbbTempletFieldCodeArray(String updateCodeData, String templetId, String fieldId, String sysId) throws Exception {
		JSONArray ja = JSONArray.fromObject(updateCodeData);
		for (int i = 0; i < ja.size(); i++) {
			JSONObject jj = JSONObject.fromObject(ja.get(i));
			String id = jj.getString("ID");
			String lookupName = jj.getString("LOOKUP_NAME");
			String lookupCode = jj.getString("LOOKUP_CODE");
			String codeIsValid = jj.getString("CODE_IS_VALID");
			String codeOrder = jj.getString("CODE_ORDER");
			CbbTempletCode oldBean = getCommTempletCodeById(id);
			hibernateDao.evict(oldBean);
			CbbTempletCode newBean = new CbbTempletCode();
			PojoUtil.copyProperties(newBean, oldBean, true);
			newBean.setLookupCode(lookupCode);
			newBean.setLookupName(lookupName);
			newBean.setCodeIsValid(codeIsValid);
			BigDecimal codeOrderb = new BigDecimal(codeOrder);
			newBean.setCodeOrder(codeOrderb);
			PojoUtil.setSysProperties(newBean, OpType.update);
			SysLogUtil.log(newBean, oldBean, OpType.update, OpResult.success);
			hibernateDao.update(newBean);
		}
	}

	/**
	 * 参考模板初始化字段通用代码删除方法
	 *
	 * @author 朱锋
	 * @param deleteData
	 * @param templetId
	 * @param fieldId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	@Override
	public void deletecommTempletCodeBydeleteData(String deleteData, String templetId, String fieldId, String sysId) throws Exception {
		JSONArray ja = JSONArray.fromObject(deleteData);
		for (int i = 0; i < ja.size(); i++) {
			JSONObject jj = JSONObject.fromObject(ja.get(i));
			String id = jj.getString("ID");
			String ctype = jj.getString("CTYPE");
			if (ctype.equals("W")) {
				if (id != null && !"".equals(id)) {
					deletecommTempletCodeById(id, sysId);
				}
			} else {
				deleteSysCode(templetId, fieldId, sysId);
			}
		}
	}

	/**
	 * 参考模版初始化字段维护获取已存在的系统ID
	 * @author 郭亮
	 * @param orgId
	 * @return
	 * @throws Exception List<String>
	 */
	public List<String> getExistSysIdByOrgId(String orgId) throws Exception {
		List<String> list = new ArrayList<String>();
		String sql = "SELECT T.SYS_ID FROM CBB_TEMPLET_INFO T WHERE T.TEMP_TYPE = 'S' AND T.ORG_ID = '" + orgId + "'";
		list = this.hibernateDao.findBySQL(sql);
		return list;
	}

	/**
	 * 判断是否存在系统初始化字段
	 * @param tid
	 * @return
	 * @throws Exception boolean
	 * @throws
	 */
	@Override
	public boolean getExistfieldBytid(String tid) throws Exception {
		boolean f = false;
		List<Object> list = new ArrayList<Object>();
		StringBuffer sbSql = new StringBuffer();
		sbSql.append("SELECT COUNT(*) FROM CBB_TEMPLET_FIELD T WHERE T.TEMPLET_ID = '" + tid + "'");
		list = this.hibernateDao.findBySQL(sbSql.toString());
		int num = Integer.parseInt(String.valueOf(list.get(0)));
		if (num > 0) {
			f = true;
		}
		return f;
	}

	/**
	 * 根据参考模板ID获取该对象
	 *
	 * @param orgId
	 * @return
	 */
	@Override
	public List<Map<String, Object>> getCommTempletFieldByTempletId(String orgId, String templetModelType, String templetId) {
		String sql = "SELECT T.COL_NAME,T.COL_TYPE FROM CBB_TEMPLET_FIELD T";
		if ("20".equals(templetModelType)) { // 普通建表不需要判断
			sql = sql + " WHERE T.ORG_ID = '" + orgId + "' AND T.TEMPLET_ID = '" + templetId + "'";
		} else {
			sql = sql + " LEFT JOIN CBB_TEMPLET_INFO T2 ON T.TEMPLET_ID = T2.ID WHERE T2.ORG_ID = '" + orgId + "' AND (T.TEMPLET_ID = '" + templetId + "' OR T2.TEMP_MODEL_TYPE ='" + templetModelType + "')";
		}
		List<Map<String, Object>> list = jdbcAvicit.getJdbcTemplate().queryForList(sql);
		return list;
	}

	/**
	 * @author youyu
	 * 获得根节点下，指定系统、模板对应的所有字段信息
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param sysNodeId
	 * @param tempModelType
	 * @return List<Map<String, Object>>
	 * */
	@Override
	public List<Map<String, Object>> getSysNodeFileds(String sysId, String orgId, String deptId, String sysNodeId, String tempModelType) {

		StringBuffer query = new StringBuffer();
		query.append("WITH T1 AS \n");
		query.append(" (SELECT T.* \n");
		query.append("    FROM CBB_TEMPLET_V T \n");
		query.append("   WHERE t.TEMP_TYPE = 'C' \n");
		query.append("     AND T.TEMP_MODEL_TYPE = '" + tempModelType + "' \n");
		query.append("     AND T.SYS_ID = '" + sysId + "' \n");
		query.append("     AND T.ORG_ID = 'ORG_ROOT' \n");
		query.append("  CONNECT BY PRIOR T.ID = T.PARENT_ID \n");
		query.append("   START WITH T.PARENT_ID = '" + sysNodeId + "') \n");
		query.append("SELECT * FROM CBB_TEMPLET_FIELD C INNER JOIN T1 ON T1.ID = C.TEMPLET_ID \n");
		List<Map<String, Object>> listFields = jdbcAvicit.getJdbcTemplate().queryForList(query.toString());
		return listFields;

	}

	/**
	 * @author youyu
	 * 获得初始化字段信息
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param sysNodeId
	 * @return List<Map<String, Object>>
	 * */
	private List<Map<String, Object>> getSysInitFileds(String sysId, String orgId, String deptId, String sysNodeId) {
		StringBuffer query = new StringBuffer();
		query.append("SELECT * FROM CBB_TEMPLET_FIELD C  \n");
		query.append(" WHERE C.TEMPLET_ID = '" + sysNodeId + "' AND C.ORG_ID = 'ORG_ROOT' ");
		List<Map<String, Object>> listFields = jdbcAvicit.getJdbcTemplate().queryForList(query.toString());
		return listFields;

	}

	/**
	 * @author youyu
	 *  验证给定的字段信息是否存在与初始化字段及根组织对应系统节点、模板类型字段中
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param sysNodeId
	 * @param tempModelType
	 * @param nodeRows
	 * @param treeType
	 * @return String
	 * */
	@Override
	public String duplicateCheck(String sysId, String orgId, String deptId, String sysNodeId, String tempModelType, String nodeRows, String treeType) throws Exception{
		String msg = "ok";
		JSONArray nodeFields = JSONArray.fromObject(nodeRows);// 当前节点字段信息

		// 获得初始化字段信息
		List<Map<String, Object>> initFilesList = getSysInitFileds(sysId, orgId, deptId, sysNodeId);

		// 获得根组织对应系统节点、模板类型字段信息
		List<Map<String, Object>> sysFiledsList = getSysNodeFileds(sysId, orgId, deptId, sysNodeId, tempModelType);

		// 判断是否有重复字段
		for (int i = 0; i < nodeFields.size(); i++) {
			JSONObject nodeFiled = JSONObject.fromObject(nodeFields.get(i));
			String filedName = nodeFiled.getString("colName").toUpperCase();
			// 判断是否与初始化字段重复
			for (Map<String, Object> map : initFilesList) {
				String initFiledName = (String) map.get("COL_NAME");
				if (filedName.equals(initFiledName.toUpperCase())) {
					msg = "字段 " + filedName + " 已经存在初始化字段中！";
					return msg;
				}
			}
			if (!treeType.equals("root")) {
				// 判断是否与根组织字段重复
				for (Map<String, Object> map : sysFiledsList) {
					String initFiledName = (String) map.get("COL_NAME");
					if (filedName.equals(initFiledName.toUpperCase())) {
						msg = "字段 " + filedName + " 已经存在根组织对应模板字段中！";
						return msg;
					}
				}
			}
		}

		return msg;
	}

	/**
	 * @author youyu
	 * 根据参考模板类型信息获得当前组织的参考模板信息和根组织的参考模板信息
	 * @param sysId
	 * @param orgId
	 * @param tempModelType
	 * @return
	 */
	public List<Map<String, Object>> getCommTempletByTempModelType(String sysId, String orgId, String tempModelType){
		StringBuffer query = new StringBuffer();
		query.append("SELECT T.* \n");
		query.append("  FROM CBB_TEMPLET_INFO T \n");
		query.append(" WHERE (T.ORG_ID = '"+orgId+"' OR \n");
		query.append("       T.ORG_ID = 'ORG_ROOT') \n");
		query.append("   AND T.SYS_ID = '"+sysId+"' \n");
		query.append("   AND T.TEMP_MODEL_TYPE = '"+tempModelType+"' \n");

		List<Map<String,Object>> list = this.jdbcAvicit.getJdbcTemplate().queryForList(query.toString());
		if(list.size() == 0){
			list = new ArrayList<Map<String,Object>>();
		}
		return list;
	}
}
